const Address = require("../model/addr.model");

class AddrService {
  /**
   * 创建地址
   * @param {Object} addr 地址信息对象
   * @returns 创建成功的地址信息对象
   */
  async createAddress(addr) {
    const res = await Address.create(addr);
    return res;
  }
  /**
   * 根据用户id查询所有收货地址
   * @param {number} user_id 用户id
   * @returns 用户所有收货地址
   */
  async findAllAddress(user_id) {
    const res = await Address.findAll({
      attributes: ["id", "consignee", "phone", "address", "is_default"], // 告诉数据库“找到记录后，要返回该记录的哪些字段”。只查询需要的字段，可以减少数据传输，优化性能（不设置时查询所有字段）
      where: {
        user_id,
      },
    });
    return res;
  }
  /**
   * 根据地址id更新收货地址信息
   * @param {number} id 地址id
   * @param {Object} addr 收货地址信息 => { consignee, phone, address }
   * @returns {boolean} 是否更新成功
   */
  async updateAddress(id, addr) {
    const res = await Address.update(addr, {
      where: {
        id,
      },
    });
    // 更新数据返回的res是一个数组，res[0]是受影响的行数，如果res[0]大于0则说明至少更新了一条数据
    return res[0] > 0 ? true : false;
  }
  /**
   * 根据地址id删除收货地址信息
   * @param {number} id 地址id
   * @returns {number} 受影响行数
   */
  async removeAddress(id) {
    const res = await Address.destroy({
      where: {
        id,
      },
    });
    // 删除数据返回的res是一个数字，res是受影响的行数，如果res大于0则说明至少删除了一条数据
    return res > 0 ? true : false;
  }
  /**
   * 根据地址id设置默认的收货地址
   * @param {*} user_id 用户id
   * @param {*} id 地址id
   * @returns {boolean} 是否更新成功
   */
  async setDefaultAddress(user_id, id) {
    // 先把用户的所有地址的is_default设为false
    await Address.update(
      { is_default: false },
      {
        where: {
          user_id,
        },
      },
    );
    const res = await Address.update(
      { is_default: true },
      {
        where: {
          id,
        },
      },
    );
    // 更新数据返回的res是一个数组，res[0]是受影响的行数，如果res[0]大于0则说明至少更新了一条数据
    return res[0] > 0 ? true : false;
  }
}

module.exports = new AddrService();
